package Experimentos;

import comun.Fichero;
import esc1Caso1.*;
import comun.GeneradorProblemas;

import aima.search.framework.Problem;
import aima.search.framework.Search;
import aima.search.framework.SearchAgent;
import aima.search.informed.HillClimbingSearch;
import aima.search.informed.SimulatedAnnealingSearch;
import IA.DistFS.Servers.WrongParametersException;

public class Main6 {

    public static void main(String [] args){
    	long tiempoIni = System.currentTimeMillis();
    	long tiempoFinal = 0;
    	int numPruebas = 20;
    	int paraMedia = 100;
    	int media1 = 0;
    	int media2 = 0;
    	System.out.println("comparacion SA con HC tiempoEjecucion");
    	System.out.println("CASO1(SA)   CASO1(HC)" );
        GeneradorProblemas generador = new GeneradorProblemas();
        try {
        
        	for(int i = 0; i < numPruebas; i++){
        		//Genera el estado inicial
                generador.generarExperimento1();
                for(int j = 0; j < paraMedia; j++){
                tiempoIni = System.currentTimeMillis();
                
                Estado caso1b = new Estado(generador.getPeticiones(), generador.getServidores(), generador.getNumServidores());
                caso1b.generarEstadoInicialMenorTiempo();
                
                //Crea y resuelve el problema
                Problem problemab = new Problem(caso1b, new FuncionSuccesores(true), new EsEstadoFinal() , new Heuristico());
                Search algoritmob = new SimulatedAnnealingSearch(300000,100,10,0.7);
                SearchAgent agentb = new SearchAgent(problemab, algoritmob);
                
                Estado resultadob = (Estado) algoritmob.getGoalState();

                tiempoFinal = System.currentTimeMillis();
                //System.out.println((tiempoFinal-tiempoIni));
                media1 += tiempoFinal-tiempoIni;
                
        	}
                
                
                for(int j = 0; j < paraMedia; j++){
                	tiempoIni = System.currentTimeMillis();
                    Estado caso1b = new Estado(generador.getPeticiones(), generador.getServidores(), generador.getNumServidores());
                    caso1b.generarEstadoInicialMenorTiempo();
                    
                    //Crea y resuelve el problema
                    Problem problemab = new Problem(caso1b, new FuncionSuccesores(false), new EsEstadoFinal() , new Heuristico());
                    Search algoritmob = new HillClimbingSearch();
                    SearchAgent agentb = new SearchAgent(problemab, algoritmob);
                    Estado resultadob = (Estado) algoritmob.getGoalState();
                    
                    tiempoFinal = System.currentTimeMillis();
                    //System.out.println((tiempoFinal-tiempoIni));
                    media2 += tiempoFinal-tiempoIni;
            	}
                System.out.println((media1/paraMedia) +"   "+ (media2/paraMedia));
                media1 = 0;
                media2 = 0;
        }
        System.out.println("FIN");
        tiempoFinal = System.currentTimeMillis();
        } catch (WrongParametersException e) {
                e.printStackTrace();
        } catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
            
            
    }
}
